是否世間萬物都有週期?那會一直輪週期的就叫做輪迴嗎?
說到 Vue 的生命週期,相信大家都看過這張圖:lifecycle
在 Vue 所使用到的整個生命週期方法,可以想像成是一齣戲要上演,哪一個主角需要在哪個時候上場、哪個配角需要在哪個時刻退場,都需要有邏輯才可以讓故事產生連貫性與流暢。
Vue 的生命週期方法雖然共有八個,但並不是每個都需要用到,就像在戲裡,有些橋段不出現、配角不出現也不會影響整齣性的故事性。
把 Vue 的生命週期分為三個大階段會比較容易理解:第一階段的「初始化顯示」、第二階段「更新狀態顯示」、第三階段「死亡、銷毀 Vue 實例」,每個階段都有對應的生命週期 callback 方法,這些生命週期的方法也稱為「生命週期鉤子」掛載在不同時期。 Vue 的生命週期比 React 還要複雜一些。
為了避免 this 的混淆,這些生命週期的方法都是回調方法(callback),所以最好一律都寫成箭頭函式,讓 this 直接指向父級。
當我們創建好一個 Vue 的實例,就會馬上進入下一個階段beforeCreate()。
beforeCreate() 實例創建前
created() 實例創建後
beforeMount() 在掛載開始之前被調用
相關的 render 函數首次被調用。
mounted()
初始化顯示之後。立即調用,是最常用的 callback,用來「掛載」到頁面上。
el選項的 DOM 節點被新創建的 vm.$el 所替換,並掛載到實例上去之後調用此生命週期方法。此時實例的資料在 DOM 節點上進行渲染。
this.xxx = value
beforeUpdate() 資料更新時調用
updated() 資料更新並且 DOM 重新渲染
當我們調用 vm.$destroy()時,就會進入下一個銷毀 Vue 實例的階段
也稱死亡,也就是沒有互動的功能。
beforeDestory() 實例銷毀之前調用
destoryed() 實例銷毀後調用
範例:一行字,每隔一秒會切換成隱藏。
在初始化之後,把初始化的值以v-show的方式讓<p>依定時器的規則顯示。
再設定一個按鈕,綁定可以銷毀 vm 的函式,當點擊按鈕時這個 vm 會銷毀而停止顯示或隱藏切換,這個定時器掛載到mounted()之後,點擊按鈕雖然會停止文字顯示的切換,卻不會停止我們在定時器裡放的console.log('++++++'),也表示「定時器」並沒有被銷毀。
要把整個定時器銷毀(進入銷毀 Vue 實例)階段,需要在beforeDestroy()這個階段清除定時器,我們可使用clearInterval()來清除定時器,但是如何找到我們要銷毀的定時器?可以在mounted()階段的定時器,指向我們設定的變數this.intervalId = setInterval()來讓清除定時器的函式找到。
在實例裡加入每個時期的生命週期方法,並用console.log印出來,執行一下頁面就可看到其順序。
mounted():主要用來發送ajax請求,啟動定時器等非同步的任務。beforeDestory():做收尾的工作,例如清除定時器,否則定時器會一直執行下去(如範例)created():進行 ajax 請求異步數據的獲取、初始化數據mounted():掛載元素內 dom 節點的獲取nextTick():針對單一事件更新數據後立即操作 domupdated():任何數據的更新,如果要做統一的業務邏輯處理watch():監聽具體數據變化,並做相應的處理來 codepen 看看:VueJs Instance Lifecycle Hooks 生命週期鉤子,別忘了觀察 console 的變化。
HTML 部分:
<button @click="destroyVm">Destroy vm</button>
<p v-show="isShow">Hello Paris</p>
Vue 實例的部分
const vm = new Vue({
  el: '#app',
  data: {
    isShow: true,
  },
  // 1.初始化顯示階段
  beforeCreate() {
    console.log('1. beforeCreate');
  },
  created() {
    console.log('2. created');
  },
  beforeMount() {
    console.log('3. beforeMount');
  },
  // 初始化後的顯示,所以放在mounted(只用一次)
  mounted() {
    console.log('4. mounted');
    // 定時器,每一秒改變一次
    this.intervalId = setInterval(() => {
      console.log('+++++++++');
      this.isShow = !this.isShow;
    }, 1000);
  },
  // 2.更新狀態顯示階段
  beforeUpdate() {
    console.log('5. beforeUpdate');
  },
  updated() {
    console.log('6. updated');
  },
  // 3.死亡、銷毀 Vue 實例階段 / 銷毀之前調用(只用一次)
  beforeDestroy() {
    // 清除定時器
    clearInterval(this.intervalId);
    console.log('7. beforeDestroy');
  },
  destroyed() {
    console.log('8. destroyed');
  },
  methods: {
    // 毀掉vm
    destroyVm() {
      this.$destroy();
    },
  },
});
每日一句法文有益身心:Ça va ? --> 撒.v 娃? --> 還好嗎? --> 你還好嗎?oui, ça va !